/**
 * @brief 检查指定函数名字是否存在
*/

#pragma once

#define DECLARE_FUNC_CHK( funcName ) \
template <typename classType > \
struct has_ ## funcName{ \
    template <typename C, typename = decltype(std::declval<C>().funcName())> \
    static std::true_type test(int); \
	\
    template <typename C>  \
    static std::false_type test(...);  \
	\
    static constexpr bool value = decltype(test< classType >(0) )::value; \
}

#define HAS_FUNC( classType , funcName ) has_##funcName< classType >::value 
// 一个参数的实现
#define DECLARE_FUNC_CHK_1( funcName , paramType1 ) \
template <typename classType > \
struct has1_ ## funcName{ \
    template <typename C, typename = decltype(std::declval<C>().funcName( *(paramType1*)nullptr))> \
    static std::true_type test(int); \
	\
    template <typename C>  \
    static std::false_type test(...);  \
	\
    static constexpr bool value = decltype(test< classType >(0) )::value; \
}

#define HAS_FUNC_1( classType , funcName ) has1_##funcName< classType >::value 
